package com.zhengdongzulin.zuke.utils;

import java.math.BigDecimal;

/**
 * 类描述：BigDecimal计算工具类
 * 作  者：Steven
 * 时  间：2018/5/10 13:51
 * Copyright © 2018年 大象公社网. All rights reserved.
 */
public class ArithUtils {
    private static final int DEF_DIV_SCALE = 10;

    /**
     * 　　* 两个Double数相加 　　* @param v1 　　* @param v2 　　* @return Double
     */
    public static Double add(Double v1, Double v2) {
        BigDecimal b1 = new BigDecimal(v1.toString());
        BigDecimal b2 = new BigDecimal(v2.toString());
        return b1.add(b2).doubleValue();
    }

    public static String add(String v1, String v2) {
        BigDecimal b1 = new BigDecimal(v1);
        BigDecimal b2 = new BigDecimal(v2);
        return b1.add(b2).toString();
    }
    /**
     * 　　* 三个Double数相加 　　* @param v1 　　* @param v2 　　* @return Double
     */
    public static Double add(Double v1, Double v2, Double v3) {
        BigDecimal b1 = new BigDecimal(add(v1, v2).toString());
        BigDecimal b2 = new BigDecimal(v3.toString());

        return b1.add(b2).doubleValue();
    }

    /**
     * 　　* 两个Double数相减
     * <p>
     * 　　* @param v1
     * <p>
     * 　　* @param v2
     * <p>
     * 　　* @return Double
     * <p>
     */
    public static Double sub(Double v1, Double v2) {
        BigDecimal b1 = new BigDecimal(v1.toString());

        BigDecimal b2 = new BigDecimal(v2.toString());

        return b1.subtract(b2).doubleValue();
    }

    public static String sub(String v1, String v2) {
        BigDecimal b1 = new BigDecimal(v1);
        BigDecimal b2 = new BigDecimal(v2);
        return b1.subtract(b2).toString();
    }

    /**
     * 　　* 两个Double数相乘
     * <p>
     * 　　* @param v1
     * <p>
     * 　　* @param v2
     * <p>
     * 　　* @return Double
     * <p>
     */
    public static Double mul(Double v1, Double v2) {
        BigDecimal b1 = new BigDecimal(v1.toString());

        BigDecimal b2 = new BigDecimal(v2.toString());

        return b1.multiply(b2).doubleValue();
    }
    public static Double mul(String v1, String v2) {
        BigDecimal b1 = new BigDecimal(v1);
        BigDecimal b2 = new BigDecimal(v2);
        return b1.multiply(b2).doubleValue();
    }

    /**
     * 　　* 两个Double数相除
     * <p>
     * 　　* @param v1
     * <p>
     * 　　* @param v2
     * <p>
     * 　　* @return Double
     * <p>
     */

    public static Double div(Double v1, Double v2) {
        BigDecimal b1 = new BigDecimal(v1.toString());

        BigDecimal b2 = new BigDecimal(v2.toString());

        return b1.divide(b2, DEF_DIV_SCALE, BigDecimal.ROUND_HALF_UP).doubleValue();
    }

    /**
     * 两个Double数相除，并保留scale位小数
     *
     * @param v1 被除数
     * @param v2 除数
     * @param scale 小数位
     * @return Double
     */
    public static Double div(Double v1, Double v2, int scale) {
        if (scale < 0) {
            throw new IllegalArgumentException("The scale must be a positive integer or zero");
        }

        BigDecimal b1 = new BigDecimal(v1.toString());
        BigDecimal b2 = new BigDecimal(v2.toString());
        return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
    }
}
